﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Facades;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL.Reports;
using System.Data.SqlClient;
using System.Data;
using GestionePolveriLib.BL;

namespace GestionePolveriLib.Facades
{
    public class QuickReportInfoFacade : FacadeBase<GestionePolveriEntities>
    {
        public QuickReportInfoFacade()
        {

        }

        public List<QuickReportInfoItem> Load()
        {
            List<QuickReportInfoItem> retValue = null;

            try
            {
                var ctx = this.GetContext();

                var obj = from x in ctx.QuickFiltri
                          select new QuickReportInfoItem
                          {
                              ID = x.IDFiltro,
                              Applicazione = x.Applicazione,
                              Famiglie = x.AnagFamiglie.Select(fam => new FamigliaColore { ID = fam.IDFamiglia, Descrizione = fam.Descrizione }),
                              Impianti = x.Impianti.Select(imp => new Impianto { ID = imp.IDImpianto, Nome = imp.Impianto, Fittizio = imp.Fittizio }),
                              Descrizione = x.Descrizione,
                              DateFrom = x.DateFrom,
                              DateTo = x.DateTo
                          };

                if(obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
            }

            return retValue;
        }

        public bool Add(QuickReportInfoItem item)
        {
            bool retValue = false;

            try
            {
                var ctx = this.GetContext();

                Transact(() => {
                    QuickFiltri qf = new QuickFiltri();
                    qf.Applicazione = item.Applicazione;

                    ctx.QuickFiltri.AddObject(qf);

                    FamigliaColoriFacade fcf = new FamigliaColoriFacade();
                    foreach (FamigliaColore fc in item.Famiglie)
                    {
                        AnagFamiglie famiglia = (from x in ctx.AnagFamiglie where x.IDFamiglia == fc.ID select x).FirstOrDefault();
                        qf.AnagFamiglie.Add(famiglia);
                    }

                    ImpiantoFacade impf = new ImpiantoFacade();
                    foreach (Impianto imp in item.Impianti)
                    {
                        Impianti impianto = (from x in ctx.Impianti where x.IDImpianto == imp.ID select x).FirstOrDefault();
                        qf.Impianti.Add(impianto);
                    }

                    ctx.SaveChanges();

                    retValue = true;
                });
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
            }

            return retValue;
        }

        public bool Add(List<QuickReportInfoItem> items)
        {
            bool retValue = false;

            try
            {
                var ctx = this.GetContext();

                Transact(() =>
                {
                    foreach (QuickReportInfoItem item in items)
                    {
                        QuickFiltri qf = new QuickFiltri();
                        qf.Applicazione = item.Applicazione;
                        //qf.DateFrom = item.DateFrom;
                        //qf.DateTo = item.DateTo;
                        qf.Descrizione = item.Descrizione;

                        ctx.QuickFiltri.AddObject(qf);

                        FamigliaColoriFacade fcf = new FamigliaColoriFacade();
                        foreach (FamigliaColore fc in item.Famiglie)
                        {
                            AnagFamiglie famiglia = (from x in ctx.AnagFamiglie where x.IDFamiglia == fc.ID select x).FirstOrDefault();
                            qf.AnagFamiglie.Add(famiglia);
                        }

                        ImpiantoFacade impf = new ImpiantoFacade();
                        foreach (Impianto imp in item.Impianti)
                        {
                            Impianti impianto = (from x in ctx.Impianti where x.IDImpianto == imp.ID select x).FirstOrDefault();
                            qf.Impianti.Add(impianto);
                        }
                    }

                }, ctx);

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
            }

            return retValue;
        }

        public bool Modify(QuickReportInfoItem item)
        {
            bool retValue = false;

            try
            {
                var ctx = this.GetContext();

                var obj = from x in ctx.QuickFiltri where x.IDFiltro == item.ID select x;

                //Transact(() =>
                //{
                    if (obj.Any())
                    {
                        Delete(item);

                        Add(item);
                    }
                //});
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
            }

            return retValue;
        }

        public bool Delete()
        {
            bool retValue = false;

            try
            {
                var ctx = this.GetContext();
                
                // alternative...
                //ctx.ExecuteStoreCommand("TRUNCATE TABLE [QuickFiltri]");
                //ctx.ExecuteStoreCommand("DELETE [QuickFiltri]");

                Transact(() => {

                    foreach (QuickFiltri obj in ctx.QuickFiltri)
                    {
                        // IMPIANTI
                        // trovo tutti gli impianti legati al filtro in esame...
                        List<Impianti> imps = obj.Impianti.ToList();

                        // cancello dalla tabella di mapping, cioè cancello la relazione senza eliminare l'impianto dal db...
                        imps.ForEach(x => obj.Impianti.Remove(x));
                        // IMPIANTI

                        // FAMIGLIE
                        // trovo tutti le famiglie legate al filtro in esame...
                        List<AnagFamiglie> fams = obj.AnagFamiglie.ToList();

                        // cancello dalla tabella di mapping, cioè cancello la relazione senza eliminare l'impianto dal db...
                        fams.ForEach(x => obj.AnagFamiglie.Remove(x));
                        // FAMIGLIE

                        // cancello dalla tabella filtri...
                        ctx.QuickFiltri.DeleteObject(obj);
                    }

                    ctx.SaveChanges();
                });

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
            }

            return retValue;
        }

        public bool Delete(QuickReportInfoItem item)
        {
            bool retValue = false;

            try
            {
                var ctx = this.GetContext();

                var obj = from x in ctx.QuickFiltri where x.IDFiltro == item.ID select x;

                if (obj.Any())
                {
                    Transact(() =>
                    {
                        foreach (QuickFiltri qf in ctx.QuickFiltri)
                        {
                            foreach (Impianti imp in qf.Impianti)
                            {
                                qf.Impianti.Remove(imp);
                            }

                            foreach (AnagFamiglie fam in qf.AnagFamiglie)
                            {
                                qf.AnagFamiglie.Remove(fam);
                            }

                            ctx.DeleteObject(obj);
                        }

                        //ctx.QuickFiltri.DeleteObject(obj.FirstOrDefault());

                        ctx.SaveChanges();
                    });
                }

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
            }

            return retValue;
        }

        public QuickSintesiItem GetSintesi2(QuickReportInfoItem item)
        {
            QuickSintesiItem retValue = null;

            string elencoIDImpianti = item.GetImpianti();
            elencoIDImpianti = (string.IsNullOrWhiteSpace(elencoIDImpianti) ? null : elencoIDImpianti);
            string elencoDescrizioneImpianti = item.GetDescrizioneImpianti();

            string elencoIDFamiglie = item.GetFamiglie();
            elencoIDFamiglie = (string.IsNullOrWhiteSpace(elencoIDFamiglie) ? null : elencoIDFamiglie);
            string elencoDescrizioneFamiglie = item.GetDescrizioneFamiglie();

            var ctx = this.GetContext();
            QuickReport_Result data = ctx.QuickReport(item.DateFrom, item.DateTo, elencoIDFamiglie, elencoIDImpianti, item.Applicazione).FirstOrDefault();

            retValue = new QuickSintesiItem();
            retValue.DateFrom = item.DateFrom;
            retValue.DateTo = item.DateTo;
            retValue.ColorwoodGrande.Kg = data.Cons_ColorwoodGrande.GetValueOrDefault(0);
            retValue.ColorwoodGrande.N = data.NP_ColorwoodGrande.GetValueOrDefault(0);
            retValue.ColorwoodGrande.Val = data.V_ColorwoodGrande.GetValueOrDefault(0);

            retValue.ColorwoodPiccolo.Kg = data.Cons_ColorwoodPiccolo.GetValueOrDefault(0);
            retValue.ColorwoodPiccolo.N = data.NP_ColorwoodPiccolo.GetValueOrDefault(0);
            retValue.ColorwoodPiccolo.Val = data.V_ColorwoodPiccolo.GetValueOrDefault(0);

            retValue.Ferro.Kg = data.Cons_Ferro.GetValueOrDefault(0);
            retValue.Ferro.N = data.NP_Ferro.GetValueOrDefault(0);
            retValue.Ferro.Val = data.V_Ferro.GetValueOrDefault(0);

            retValue.Ral1.Kg = data.Cons_RAL1.GetValueOrDefault(0);
            retValue.Ral1.N = data.NP_RAL1.GetValueOrDefault(0);
            retValue.Ral1.Val = data.V_RAL1.GetValueOrDefault(0);

            retValue.Ral2.Kg = data.Cons_RAL2.GetValueOrDefault(0);
            retValue.Ral2.N = data.NP_RAL2.GetValueOrDefault(0);
            retValue.Ral2.Val = data.V_RAL2.GetValueOrDefault(0);

            retValue.Verticale.Kg = data.Cons_Verticale.GetValueOrDefault(0);
            retValue.Verticale.N = data.NP_Verticale.GetValueOrDefault(0);
            retValue.Verticale.Val = data.V_Verticale.GetValueOrDefault(0);

            retValue.Descrizione = item.Descrizione;
            retValue.Tipo = item.Applicazione;

            retValue.Kg_Tot = data.TotKG.GetValueOrDefault(0);
            retValue.N_Tot = data.TotNP.GetValueOrDefault(0);
            retValue.Val_Tot = data.TotVAL.GetValueOrDefault(0);

            retValue.AllineamentoInventario.Kg = data.Cons_AllineamentoInventario.GetValueOrDefault(0);
            retValue.AllineamentoInventario.N = data.NP_AllineamentoInventario.GetValueOrDefault(0);
            retValue.AllineamentoInventario.Val = data.V_AllineamentoInventario.GetValueOrDefault(0);

            retValue.Venduto.Kg = data.Cons_Venduto.GetValueOrDefault(0);
            retValue.Venduto.N = data.NP_Venduto.GetValueOrDefault(0);
            retValue.Venduto.Val = data.V_Venduto.GetValueOrDefault(0);

            retValue.Smaltito.Kg = data.Cons_Smaltito.GetValueOrDefault(0);
            retValue.Smaltito.N = data.NP_Smaltito.GetValueOrDefault(0);
            retValue.Smaltito.Val = data.V_Smaltito.GetValueOrDefault(0);

            retValue.Reso.Kg = data.Cons_Reso.GetValueOrDefault(0);
            retValue.Reso.N = data.NP_Reso.GetValueOrDefault(0);
            retValue.Reso.Val = data.V_RESO.GetValueOrDefault(0);

            retValue.Inventario.Kg = data.Cons_Correzione.GetValueOrDefault(0);
            retValue.Inventario.N = data.NP_Correzione.GetValueOrDefault(0);
            retValue.Inventario.Val = data.V_Correzione.GetValueOrDefault(0);

            foreach (FamigliaColore fam in item.Famiglie)
            {
                retValue.DescrizioneFamiglia += fam.Descrizione.Trim() + " + ";
            }

            if(retValue.DescrizioneFamiglia.Count() > 0)
              retValue.DescrizioneFamiglia = retValue.DescrizioneFamiglia.Substring(0, retValue.DescrizioneFamiglia.LastIndexOf(" + "));

            return retValue;
        }
    }
}
